import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;

/**  
* Gson类库的封装工具类，专门负责解析json数据</br>  
3. * 内部实现了Gson对象的单例  
4. * @author zhiweiofli  
5. * @version 1.0  
6. * @since 2012-9-18  
7. */  
public class JsonUtil {   
  
    private static Gson gson = null;   
       
    static {   
        if (gson == null) {   
            gson = new Gson();   
        }   
    }   
  
    private JsonUtil() {   
       
    }   
  
    /**  
     * 将对象转换成json格式  
     *   
     * @param ts  
     * @return  
     */  
    public static String objectToJson(Object ts) {   
        String jsonStr = null;   

Gson gson = new GsonBuilder().serializeNulls().create();
        if (gson != null) {   
            jsonStr = gson.toJson(ts);   
        }   
        return jsonStr;   
    }   

    /**  
     * 将对象转换成json格式(并自定义日期格式)  
     *   
     * @param ts  
     * @return  
     */  
    public static String objectToJsonDateSerializer(Object ts,   
            final String dateformat) {   
        String jsonStr = null;   
        gson = new GsonBuilder()   
                .registerTypeHierarchyAdapter(Date.class,   
                        new JsonSerializer<Date>() {   
                            public JsonElement serialize(Date src,   
                                    Type typeOfSrc,   
                                    JsonSerializationContext context) {   
                                SimpleDateFormat format = new SimpleDateFormat(   
                                        dateformat);   
                                return new JsonPrimitive(format.format(src));   
                            }   
                        }).setDateFormat(dateformat).create();   
        if (gson != null) {   
            jsonStr = gson.toJson(ts);   
        }   
        return jsonStr;   
    }   
  
    /**  
     * 将json格式转换成list对象  
     *   
     * @param jsonStr  
     * @return  
     */  
    public static List<?> jsonToList(String jsonStr) {   
        List<?> objList = null;   
        if (gson != null) {   
            Type type = new com.google.gson.reflect.TypeToken<List<?>>() {
            }.getType();   
            objList = gson.fromJson(jsonStr, type);   
        }   
        return objList;   
    }   
    

    
    /**  
     * 将json格式转换成list对象，并准确指定类型  
     * @param jsonStr  
     * @param type  
     * @return  
     */  
    public static List<?> jsonToList(String jsonStr, Type type) {
        List<?> objList = null;   
        if (gson != null) {   
           objList = gson.fromJson(jsonStr, type);   
        }   
        return objList;   
    }   
  

    /**  
     * 将json格式转换成map对象  
     *   
     * @param jsonStr  
     * @return  
     */  
    public static Map<?, ?> jsonToMap(String jsonStr) {   
        Map<?, ?> objMap = null;   
        if (gson != null) {   
            Type type = new com.google.gson.reflect.TypeToken<Map<?, ?>>() {
            }.getType();   
            objMap = gson.fromJson(jsonStr, type);   
        }   
        return objMap;   
    }   
  
    
    /**  
     * 将json格式转换成map对象  
     *   
     * @param jsonStr  
     * @return  
     */  
    public static Map<?, ?> jsonToMap2(String jsonStr) {   
        Map<?, ?> objMap = null;  
        Gson gson=new GsonBuilder()
                .registerTypeAdapter(
                        new TypeToken<TreeMap<String, Object>>(){}.getType(), 
                        new JsonDeserializer<TreeMap<String, Object>>() {

                        public TreeMap<String, Object> deserialize(
                        JsonElement json, Type typeOfT, 
                        JsonDeserializationContext context) throws JsonParseException {

                            TreeMap<String, Object> treeMap = new TreeMap<String, Object>();
                            JsonObject jsonObject = json.getAsJsonObject();
                            Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
                            for (Map.Entry<String, JsonElement> entry : entrySet) {
                                treeMap.put(entry.getKey(), entry.getValue());
                            }
                            return treeMap;
                        }
                    }).create(); 
        if (gson != null) {   
//            java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?, ?>>() {   
//            }.getType();   
            objMap = gson.fromJson(jsonStr, new TypeToken<TreeMap<String, Object>>(){}.getType());   
        }   
        return objMap;   
    } 
    /**  
     * 将json转换成bean对象  
     *   
     * @param jsonStr  
     * @return  
     */  
    public static Object jsonToBean(String jsonStr, Class<?> cl) {   
        Object obj = null;   
        if (gson != null) {   
            obj = gson.fromJson(jsonStr, cl);   
        }   
       return obj;   
    }   
  
    /**  
     * 将json转换成bean对象  
     *   
     * @param jsonStr  
     * @param cl  
     * @return  
     */  
    @SuppressWarnings("unchecked")   
    public static <T> T jsonToBeanDateSerializer(String jsonStr, Class<T> cl,   
            final String pattern) {   
        Object obj = null;   
        gson = new GsonBuilder()   
                .registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {   
                    public Date deserialize(JsonElement json, Type typeOfT,   
                            JsonDeserializationContext context)   
                            throws JsonParseException {   
                        SimpleDateFormat format = new SimpleDateFormat(pattern);   
                        String dateStr = json.getAsString();   
                        try {   
                            return format.parse(dateStr);   
                        } catch (ParseException e) {   
                            e.printStackTrace();   
                        }   
                        return null;   
                    }   
                }).setDateFormat(pattern).create();   
        if (gson != null) {   
            obj = gson.fromJson(jsonStr, cl);   
        }   
        return (T) obj;   
    }   
  
    /**  
     * 根据  
     *   
     * @param jsonStr  
     * @param key  
     * @return  
     */  
    public static Object getJsonValue(String jsonStr, String key) {   
        Object rulsObj = null;   
        Map<?, ?> rulsMap = jsonToMap(jsonStr);   
        if (rulsMap != null && rulsMap.size() > 0) {   
            rulsObj = rulsMap.get(key);   
        }   
        return rulsObj;   
    }   
  
}  
